//! # RustCloud Security - 安全基础设施
//!
//! 为 RustCloud 微服务生态系统提供统一的安全抽象和接口定义。
//! 本模块是所有安全相关功能的基础，确保整个生态系统的一致性和互操作性。
//!
//! ## 核心职责
//!
//! * **统一接口定义** - 所有认证授权相关的 trait 和抽象
//! * **核心数据结构** - `AuthContext`、`Principal`、`Resource` 等
//! * **错误处理** - 统一的安全错误类型和处理机制
//! * **公共工具** - 加密、令牌处理等通用功能
//! * **集成支持** - 与各种 Web 框架的集成接口
//!
//! ## 设计原则
//!
//! * **接口优先** - 依赖抽象而非具体实现
//! * **零重复** - 整个生态系统中安全相关定义只存在一份
//! * **高内聚** - 相关功能紧密组织在一起
//! * **低耦合** - 最小化对外部依赖的要求
//! * **可扩展** - 易于添加新的认证方式和安全功能
//!
//! ## 使用示例
//!
//! ```rust
//! use rustcloud_security::prelude::*;
//!
//! // 基础认证流程
//! async fn authenticate_request(
//!     provider: &dyn AuthProvider,
//!     context: &AuthContext
//! ) -> AuthResult<Principal> {
//!     provider.authenticate(context).await
//! }
//!
//! // 权限检查
//! async fn check_authorization(
//!     authz: &dyn AuthorizationProvider,
//!     principal: &Principal,
//!     resource: &Resource
//! ) -> AuthResult<bool> {
//!     authz.authorize(principal, resource).await
//! }
//! ```

pub mod core;
pub mod providers;
pub mod utils;

// 重新导出核心类型，方便使用
pub use core::{
    AuthContext, Principal, PrincipalType, Resource,
    AuthError, AuthResult, SecurityError, SecurityResult,
};

// 重新导出核心接口
pub use providers::{
    AuthProvider, AuthProviderType,
    AuthenticationService, AuthorizationProvider,
    TokenService, PermissionChecker, SessionManager,
};

// 重新导出工具
pub use utils::{
    CryptoUtils, TokenUtils, SecurityValidator,
};

/// 便捷的预导入模块
///
/// 包含最常用的类型和接口，可以通过 `use rustcloud_security::prelude::*;` 导入。
pub mod prelude {
    // 核心数据结构
    pub use crate::core::{
        AuthContext, Principal, PrincipalType, Resource,
        AuthError, AuthResult, SecurityError, SecurityResult,
    };
    
    // 核心接口
    pub use crate::providers::{
        AuthProvider, AuthProviderType,
        AuthenticationService, AuthorizationProvider,
        TokenService, PermissionChecker, SessionManager,
    };
    
    // 实用工具
    pub use crate::utils::{
        CryptoUtils, TokenUtils, SecurityValidator,
    };
    
    // 常用外部类型
    pub use async_trait::async_trait;
    pub use std::collections::HashMap;
    pub use std::sync::Arc;
    pub use std::time::{Duration, SystemTime};
}

#[cfg(test)]
mod tests {
    use super::prelude::*;

    #[test]
    fn test_module_exports() {
        // 测试所有导出是否可用
        let _context = AuthContext::new(
            Default::default(),
            "GET".to_string(),
            "/test".to_string(),
            None,
        );
        
        let _principal = Principal::new(
            "test_user".to_string(),
            "Test User".to_string(),
            PrincipalType::User,
        );
        
        let _resource = Resource::new(
            "test-service".to_string(),
            "/api/test".to_string(),
            "GET".to_string(),
        );
    }

    #[test]
    fn test_error_types() {
        let _auth_error = AuthError::AuthenticationFailed("test".to_string());
        let _security_error = SecurityError::InvalidCredentials("test".to_string());
    }
}